iT邦幫忙

2024 iThome 鐵人賽

DAY 21
0
生成式 AI

RAG自己來系列:客服機器人系列 第 21

[Day 21] 設計移除文件頁面

  • 分享至 

  • xImage
  •  

為了進一步完善我們的系統,有新增文件的功能,也要來個刪除文件的功能

在上傳文件的時候,我們有給每筆文件一個 metadata,內容則是給當前段落的檔案名稱

為此,我們也需要可以儲存歷史上傳過文件的檔案資訊,而在這邊我的選擇是,用一個本地的 Json 協助我們儲存這些資訊,所以先在工作目錄底下新增一個 config.json 的檔案

{
  "uploads": []
}

程式的部分我們修改部分的片段即可

  • ./utils.py

    import json
    
    class File:
        def upload_file(file_paths: list):
            yield "上傳中"
            try:
                for file_path in file_paths:
                    reader = PyPDF2.PdfReader(open(file_path, 'rb'))
                    for index in range(len(reader.pages)):
                        qdrant_client.add(
                            collection_name="iron",
                            documents=[reader.pages[index].extract_text()],
                            metadata=[{"filename": os.path.basename(file_path)}]
                        )
    
                    config = json.loads(open("./config.json", "r").read())
                    config["uploads"].append(os.path.basename(file_path))
                    open("./config.json", "w").write(json.dumps(config, indent=4))
    
            except:
                yield "上傳失敗"
    
            yield "上傳成功"
    

這時我們進入http://127.0.0.1:6333/dashboard中將 collection 刪掉後重新上傳一次文件

https://ithelp.ithome.com.tw/upload/images/20240929/20146555laONjWNd4a.png

可以看到我們上傳過的文件出現在 config.json 中

這時再修改一點前端頁面

  • ./main.py

    ...
    with gr.Blocks() as demo:
      ...
    
      with gr.Tab(label="manage"):
          with gr.Row():
             filelist_dropdown = gr.Dropdown(
                value="None",
                choices=File.list_files(),
                multiselect=True
             )
             filelist_btn = gr.Button(
                value="刪除"
             )
    
         filelist_btn.click(
            File.delete_file,
            inputs=[filelist_dropdown],
            outputs=[filelist_dropdown]
         )
    
  • utils.py

    這邊我們建立一個函數讓前端頁面初始化時可以讀取 config.json 中的內容,再定義了當filelist_btn有了 click 的行為時,執行delete_file的函式,且根據使用者選取的檔案名稱遞迴地刪除在 Qdrant 中,metadata 的 filename 符合file的資料列

    ...
    
    class File:
        ...
        def list_files():
            return json.loads(open("./config.json", "r").read())["uploads"]
    
        def delete_file(selected_files: list):
            config = json.loads(open("./config.json", "r").read())
            for file in selected_files:
                qdrant_client.delete(
                    collection_name="iron",
                    points_selector=models.FilterSelector(
                        filter=models.Filter(
                            must=[
                                models.FieldCondition(
                                    key="filename",
                                    match=models.MatchValue(value=file),
                                ),
                            ],
                        )
                    )
                )
                config["uploads"].remove(file)
    
            open("./config.json", "w").write(json.dumps(config, indent=4))
            yield gr.update(choices=File.list_files(), value=[])
    

實際測試刪除效果,在 Qdrant 中的第一筆為豪鬼 - 維基百科自由的百科全書.pdf的資料

https://ithelp.ithome.com.tw/upload/images/20240929/201465558RJ0BVRpsl.png

這時我們回到前端頁面,並選取該文件後點選刪除的按鈕後

https://ithelp.ithome.com.tw/upload/images/20240929/201465553zChPqBNUZ.png

重新刷新 Qdrant 的前端後,有關豪鬼 - 維基百科自由的百科全書.pdf的資訊已全數移除

https://ithelp.ithome.com.tw/upload/images/20240929/201465557bgY6zP607.png


上一篇
[Day 20] 結合分頁功能
下一篇
[Day 22] 新增設定參數區塊
系列文
RAG自己來系列:客服機器人30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言